服务项目:电脑维修 | 域名注册 | 虚拟主机 | 网站制作 | 网站推广 | 企业邮箱 |
首页 服务方案 技术支持与下载 个性化服务 关于家龙
User :

Pass :
认证说明
在线预约修电脑
在线提交制作网站要求
阅读选项: 自动滚屏[左键停止]

用Winsock控件开发Internet软件


2005 年 2 月 27 日 回龙观电脑网

  今天是因特网的光辉时代。许多网友们都渴求“知其然,也知其所以然”。本文要与您交流的Winsock正是当前Internet软件开发的主要工具之一,很多的程序都是利用它实现的。Winsock在Internet开发中具有不可替代的作用。我们将通过一个“聊天实验室”软件的制作过程来和您共同探讨Winsock控件在Internet网络应用程序开发中的技术。


  一、什么是Winsock控件?


  每个ActiveX控件都有它独特的功能,而这些功能就标志着这个控件是什么。其中的Winsock控件就提供了访问TCP和UDP网络服务的方便途径。程序员可以使用它来完成网络应用程序的开发。

  Winsock控件以部件的形式将Winsock APIs形象地呈现给程序员。Visual Basic、Visual C++、Microsoft Access或 Visual FoxPro 的开发人员都可使用它,使用方法大同小异,在此您将了解在VB5中的使用方法。为编写客户或服务器应用程序,不必了解TCP的细节或调用低级的Winsock APIs,只需通过设置控件的属性并调用其方法就可方便地连接到一台远程机器上去,并且还可双向交换数据。网络应用程序的关键无非就在这里,当我们做到这一点时,基于Internet网络的应用程序也就完成了。

  那么,TCP是怎么回事呢?

  如果您想编写TCP(Transfer Control Protocol)协议的程序,那么就必须创建和维护与某台远程计算机的连接,一旦将这两台计算机连接到一起,即可彼此进行数据传输。比如,您可以写一句话传给对方,并在他的显示器上显示出来。这里所说的“连接”只是表示两台计算机的关系,至于它是如何连接在一起的,您是无法通过眼睛来观察的,但它们的确可以交换信息了。

  在这种协议下,如果您要创建服务器应用程序,首先设置一个收听端口(LocalPort属性),并调用Listen方法。Winsock控件就会时刻观察这个端口的一举一动,即“侦听”。当端口中有某台客户计算机发出连接请求时,Winsock中就会发生 ConnectionRequest事件。如果服务器应用程序同意连接,就在ConnectionRequest事件的代码内调用Accept(接受)方法,连接就算完成,也就可以收发数据了。

  如果您要创建客户应用程序,就必须知道服务器计算机名或者IP地址(这两种都是RemoteHost属性),还要知道进行“侦听”的端口(RemotePort属性),设置好这两项后,调用Connect方法来向服务器计算机发出连接请求。

  建立连接后,任何一方计算机都可以收发数据。其方法就是调用SendData方法,将数据发出。当有数据到达时会发生 DataArrival事件,您可以在DataArrival事件内调用GetData 方法就可获取数据。

  交换数据的基本过程就是如此简单。

  您还可以使用UDP网络协议来通信。

  用户数据文报协议(UDP)是一个无连接协议。跟TCP的操作不同,计算机并不建立明确的连接关系。另外,一个UDP应用程序可以是客户,也可以是服务器,双方是对称的。

  假设有甲、乙两台机器。为了传输数据,首先要设置甲方中Winsock控件的LocalPort属性。然后,乙方只需将其RemoteHost设置为甲方机器的Internet地址,并将RemotePort属性设置为跟甲方的LocalPort属性相同的端口,并调用SendData方法来发送信息。于是,甲方就会使用DataArrival事件内的GetData方法来获取已发送来的信息。这样也可以实现与TCP协议相似的功能,但它比TCP简单,当然,它所能实现的功能也就相对有限一些。

  Winsock控件可以使用这两种协议,到底使用哪种好呢?这要根据我们将要设计的应用程序而定。通过上面的分析,我们可以看出,如果在收发数据之前,客户端需要得到服务器的确认信息,就必须建立明确的连接,因此也就必须使用TCP协议。另外,如果收发的数据量较大,也应该使用TCP,因为它可以确保数据传输的完整性。虽然这两个优点都道出了TCP的长处,但我们也必须看到,TCP在完成这些功能的同时,占用的资源却比UDP多,相对来说就显得“昂贵”了一些,资源也是要花钱的。

  我们首先说明如何使用TCP协议来完成我们的设计,在后面的部分中再来说明UDP的技术。


  二、“聊天实验室”的蓝图


  为了明确地向您展示Winsock控件的应用,我们给您一个简单的示例,它演示了Winsock控件编程的基本方法,您可以在此基础上,或按照类似的思路来扩展您的程序,并将以前已掌握的其他技术和Winsock结合使用,从而开发出满足您需要的复杂程序。现在我们提出一个设计蓝图。

  既然要“聊”,自然不会只有一个人,所以我们要演示的程序有两个,其中一个是客户,另一个作为服务器。两台机器联网后,客户可以呼叫对方,服务器收到连接请求则接受请求,同意和客户聊天。连接成功以后,两人可以在输入框中写入自己想说的话,并按按钮将刚写入的文字发出。两个人的对话会在显示框中按次序分别显示出来—这个过程就像在网上聊天室中看到的一样。


  三、Winsock中的方法、事件和属性


  “工欲善其事,必先利其器。”在具体制作聊天室程序之前,我们先来研究一下Winsock控件这个“利器”中有哪些方法、事件和属性需要用到。明白了这些内容,我们就向使用Winsock控件设计程序迈出了一大步。

  根据前面对TCP协议的了解和对蓝图的构想,我们将使用:

  方法(Method)

  Listen:服务器用来创建套接字并将它设置为侦听模式,等待客户的呼叫。

  Connect:客户用来向服务器发出连接请求。

  Accept:服务器察觉到客户的呼叫(连接请求),用此方法来表示同意连接。

  SendData:将数据发送给另一方。

  GetData:接收来自对方的数据,并将这些数据保存起来。

  Close:将现在正使用的连接关闭。

  事件(Event)

  ConnectionRequest:服务器“听”到客户发来连接请求后,这个事件就发生了。此时服务器就要表示接受(Accept)或不接受连接。

  DataArrival:如果对方使用SendData发来数据,这个事件就发生了。此时应该处理这些发来的数据,比如将它存到数据库中或显示出来等。

  属性(Property)

  LocalPort:对服务器来说,是设置一个本地端口,方法Listen将侦听来自它的消息。

  RemotePort:客户用来设置要访问的远端端口,即服务器端的LocalPort值。

  RemoteHost:客户用来指定要连接的计算机,既可以使用IP地址,如“123.123.123.123”,也可以使用计算机名。

  State:Winsock控件所处的状态,也就是两台机器连接的状态。

  虽然只有这么简单的几个名词,但它们的使用方法却很灵活,用途也比较广。在进一步设计更完善的程序时,您需要参考VB5中有关的帮助。仅有这些方法、事件、属性并不能充分发挥Winsock控件的作用,因此,它还有许多其他的方法、事件和属性,大大扩展了Winsock的功能。但上述这些对于一个简单的“聊天实验室”应用程序还是够用的。


  四、把构想变成真正的程序


  1.确定计算机的名字

  在“控制面板”中双击“网络”图标,单击“标识”选项卡,在“计算机名称”框中可以找到该名称。或者单击“配置”选项卡,选择“TCP/IP”并单击“属性”按钮,再单击“IP地址”选项卡。找到IP地址,如果没有,则您可以先随便指定一个,如123.123.123.123。这对实验来说无关紧要。

  我们将在程序中使用IP地址,您可以根据自己的喜好选择使用计算机名称。上面找到的计算机名称和IP地址可以作为 RemoteHost 属性的值。

  2.建立一个服务器端程序(见图1)

int43_1.jpg (7224 字节)
  图1

  先创建新的Standard EXE工程,命名为chatS。将缺省窗体的名称改为frmServer;将窗体的标题改为“聊天实验室-服务器”。再把一个Winsock控件拖到窗体上,将它的名字改为tcpServer。

  在窗体上添加两个TextBox控件。第一个命名为txtTalk,并设置为多行,只有垂直滚动条;第二个为txtInput,其他属性不变。

  添加一个按钮,并命名为cmdSend,标题“发送”。

  在各自的事件驱动中为窗体添加如下的代码:

  在frmServer窗体加载时,设置端口并开始侦听:

tcpServer.LocalPort = 1001

tcpServer.Listen

  tcpServer控件收到请求时,应做检测,并接受请求:

  If tcpServer.State 〈〉sckClosed Then

   tcpServer.Close

   End If

  tcpServer.Accept requestID

  如果按下了发送按钮,就应该将txtInput中输入的文字发送出去,当然,也应该在自己的屏幕上留个底:

  tcpServer.SendData txtInput.Text

  txtTalk.Text = txtTalk.Text + Chr(13) + Chr(10) + " S - " + txtInput.Text

  数据到达(DataArrival中)时,接收这些数据,并把它们显示出来:

Dim strData As String

tcpServer.GetData strData

txtTalk.Text = txtTalk.Text + Chr(13) + Chr(10) + " C - " + strData

  3.建立一个客户端程序(如图2)

int43_2.jpg (6937 字节)
  图2

  创建新的Standard EXE工程,命名为chatC。将缺省窗体的名称改为frmClient。将窗体的标题改为“聊天实验室-客户”。

  将一个Winsock控件拖到窗体上,并将它的名字改为tcpClient。

  在窗体上添加两个TextBox控件。将第一个命名为txtTalk,并设置为多行,只有垂直滚动条,第二个为txtInput,其他属性不变。

  添加两个按钮,并分别命名为cmdSend,标题“发送”和cmdConnect,标题“连接”。

  在各自的事件驱动中为窗体添加如下的代码:

  首先,必须和服务器连接,要用按下一个“连接”按钮来完成(cmdConnect_Click):

   If tcpClient.State = sckConnected Then Exit Sub

   tcpClient.RemoteHost = "123.123.123.123"

   tcpClient.RemotePort = 1001

   tcpClient.Connect

  客户端当然也要发送数据,所以在“发送”按钮按下时和在服务器中是完全一样的,区别是二者发送的方向相反,但完成这两件相反工作的代码是完全相同的。当tcpClient检测到服务器的数据到达时,也要在DataArrival事件中采取与服务器相同的手段来处理。

  至此,“聊天实验室”已经胜利竣工了(见图3)。我们并没有给您太多的代码,原因是使用Winsock控件本来就很简单,上述的代码已经说明了许多问题,您可以根据需要再补充和修改其中的内容,比如使控制更灵活一些或界面更漂亮一点。现在您可以把它们编译成可执行文件,分发到不同的机器上去运行。去试一试吧。怎么样,使用Winsock控件还不算困难吧?要知道,Internet是基于TCP/IP的网络,您的程序当然也可以在Internet上运行。您在编写这段程序时,完全可以在同一台机器上调试。

int43_3.jpg (8785 字节)
  图3


  五、使我们的设计更好


  不论怎么说,这段程序毕竟还是太简单了,尤其是它的功能少,现有的功能也不完善,在用一段时间后就会发现它远远不能满足要求,但这都不是Winsock的问题。而需要我们不断改进它,充实它,扩展它的功能,增强它的容错性能。只要您会使用VB5编程,就可以逐步解决这些问题。

  比如可以将客户端和服务器端都集中在一个程序中,这样任何拥有此程序的人都可以呼叫另一个人或等待别人的呼叫,就象打电话一样。

  我们还可以增加一个功能,来修改客户端在发出连接请求时使用的对方计算机名或IP地址和对方端口号。于是客户就可以呼叫不同的计算机,“电话”所能覆盖的范围就扩大了。

  上面设计的服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,服务器就不再需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法,建立了连接,并且另一个Winsock控件仍然在“侦听”。


  六、关于Winsock的另一个技术问题


  我们在前面提到了UDP协议,以及它与TCP协议的比较。上面已经完成了相对复杂的TCP协议的数据传递,再来研究UDP的使用就不困难了。

  使用UDP协议的步骤少,双方都不需要“侦听”其他人的呼叫,不必事先建立连接,并且任何一方都可以直接和对方对话。要使用UDP协议,请先将Winsock控件的Protocol属性设为1-sckUDPProtocl(默认为0-skTCPProtocol)。要在两个控件中间收发数据,只需要完成以下三步即可:

  1.将 RemoteHost 属性设置为另一台计算机的名称。

  2. 将 RemotePort 属性设置为第二个控件的 LocalPort 属性。

  3. 调用 Bind 方法,指定要使用的 LocalPort。

  在这种协议下,因为两台计算机的地位可以看成是“平等的”,这种应用程序也被称为“点到点”。您可以仿照上面的“聊天实验室”用UDP协议来编写另一个程序,同样能取得很好的效果。当然,您必须明白,用UDP协议得到的程序,就没有“服务器”和“客户”端的说法了。


  七、更上一层楼


  既然掌握了Winsock控件的使用方法,我们就有理由设计出更实用、更先进的软件来。Winsock控件一般有以下用途:

  1.创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。比如,您可以使用这一用途来设计数据采集程序,将繁重的数据录入工作分散到基层,或者设计成在Internet上进行客户调查和注册的部件,将它下载到千家万户。

  2.创建一个服务器应用程序,作为多用户数据的汇入点。这一用途和第一种用途配合使用,必将会为您带来丰厚的商业利润。

  3.创建“聊天”应用程序。我们已经设计了一个聊天程序,或许您可以将它设计得更好,像Microsoft Chat或mIRC等流行的聊天软件一样,成为市场上的抢手货。

  最后,笔者祝愿您更上一层楼。 

打印全文】 【关闭
站内地图 | 帮助中心 | 意见反馈 | 招聘信息 | 联系我们 版权所有:2003 - 2008 回龙观电脑网

热线电话:010 - 62843143